我一開始看到這題,感覺他像可以用Greedy解法解的問題,然後又想他是III,所以他也可以用圖呈現?
感覺需要先將課程依照期限,由小排到大。
後來查找了一下,感覺他像Activity Network ( PERT Network )的問題。
所以這題的問題是:要怎麼用手中的現有資訊,組出一個合理的流程圖?
因為沒什麼思路,所以我就照Hint 1, Hint2做。
想用2D vector的其中一個column進行排序的話,可以做一個custom sort。
for (auto pair: courses) {
cout << pair[0] << " " << pair[1] << ", ";
}
sort(courses.begin(), courses.end(),
[] (const vector<int> &coursea, const vector<int> &courseb)
{
return coursea[1] < courseb[1];
});
cout << endl;
for (auto pair: courses) {
cout << pair[0] << " " << pair[1] << ", ";
}
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(), courses.end(),
[] (const vector<int> &coursea, const vector<int> &courseb)
{
return coursea[1] < courseb[1];
});
int currentTotalTime = 0, count = 0;
priority_queue<int> pq;
for (auto pair: courses) {
currentTotalTime += pair[0];
pq.push(pair[0]);
if (currentTotalTime <= pair[1])
count++;
else if((currentTotalTime > pair[1]) && !pq.empty()) {
int curr_biggest = pq.top();
currentTotalTime -= curr_biggest;
pq.pop();
}
}
return count;
}
};
後來看Hint後有點回過味來,其實這題不需要安排流程圖,只是要在有限時間內塞越多工作越好,所以遇到飽和的情況,就把比較肥的東西丟走,這樣理論上就能容納更多小的東西。
所以最後我就用heap(priority quequ)儲存合理的工作內容,一但有超過的情況,就召喚最大值,把它刪了。
參考:
https://web.ntnu.edu.tw/~algo/DirectedAcyclicGraph.html
https://stackoverflow.com/questions/45494567/c-how-to-sort-the-rows-of-a-2d-vector-by-the-values-in-each-rows-column
https://leetcode.com/problems/course-schedule-iii/
https://yuihuang.com/cpp-stl-priority-queue/